Geography of Covid Vaccine Hesitancy in the U.S.
Vaccine Line in Boston Massachusets, March 2021
Introduction
Back in March, I created my PUG Shiny project with a focus on COVID vaccine distribution. At the time, the issue facing the united states was primarily one of distribution: people who wanted the vaccine couldn’t get it. Eligibility was restricted state by state to allocate a precious resource. Even people who were eligible needed to get lucky and navigate online sign up forms, vouching for fewer spots than people. Here’s my Shiny App, improved and updated with the latest data:
Motivation
Over the past six weeks, the supply chain has greatly improved, and access is no longer such a pressing issue. The issues facing the country have evolved: the issue now is acheiving heard immunity, and getting everyone vaccinated. In March, I didn’t know anyone who had gotten a vaccine. But now in April, I don’t know anyone who hasn’t gotten one. I wanted to map out where in the country people are the most hesitant to get vaccinated. Knowing the most resistant geographies could be useful information for government organizations to focus their vaccine advocacy efforts.
Anti-Vax Protesters in Texas
Mapping County-Level Vaccine Hesitancy
Inter-Agency Knowledge Sharing
I investigated a CDC published dataset titled “Vaccine Hesitancy for COVID-19: County and local estimates.” The dataset comes from a publication by the ASPE, the Office of the Assistant Secretary for Planning and Evaluation, of the U.S. Department of Health and Human Services. Specifically, the data was collected via the U.S. Census Bureau’s Household Pulse Survey, 2021 Week 28, April 14-26.
H2: Variables of Interest
The dataset contained several demographic variables measured for each U.S. county. The variables of interest for this project are “Estimated Hesitant” and “Estimated Strongly Hesitant”, which measure the percent of adults in each county who indicated they are either hesitant, or strongly hesitant, respectively, to get vaccinated. Due to the phrasing of the variable description, I assume that survey respondents who indicated either “Hesitant” or “Strongly Hesitant” are all adults who have not yet received a covid vaccine. You can check out the ASPE’s methodology for these estimates here.
H2: Data Wrangling
H3: Fauci with a headache, or …
fauchi
H3: Data Wrangling
my_data0 <- my_data %>%
#select columns relevant to my investigation
select(c("County Name","State","Estimated hesitant", "Estimated strongly hesitant","Social Vulnerability Index (SVI)","SVI Category","Ability to handle a COVID-19 outbreak (CVAC)","CVAC Category","Percent adults fully vaccinated against COVID-19 as of 3/30/2021"))%>%
#change names to lowercase for easy merging with map dataset
mutate(State = tolower(State), `County Name` = tolower(`County Name`))%>%
#rename columns to r-friendly names
rename(region = State, subregion = `County Name`) %>%
rename(est_hesitant = "Estimated hesitant")%>%
rename(est_strong_hesitant = "Estimated strongly hesitant")%>%
rename(svi_cat = "SVI Category" )%>%
rename(svi = "Social Vulnerability Index (SVI)" )%>%
rename(pct_full_vaxed = "Percent adults fully vaccinated against COVID-19 as of 3/30/2021")
#edit subregion (county name) values to match their equivs in map dataset
my_data0$subregion <- str_remove(my_data0$subregion, " county.*")
my_data0$subregion <- str_remove(my_data0$subregion, ",.*")
H2: Making the maps
H3: Code
Creating mapable data set
{r} # usa_counties <- map_data(map = "county", region = ".") # # my_data0_map <- my_data0 %>% # inner_join(usa_counties, by =c("subregion", "region")) #
Mapping of hesitancy
{r,eval= FALSE} # ggplot(my_data0_map, aes(x = long, y = lat, group = group, fill = est_hesitant)) + # geom_polygon(color = "white", size = 0.05) + # theme_void() + # coord_fixed(ratio = 1.3) + # labs(fill = "Proportion of residents hesitant to be vaccinated") + # theme(legend.position="bottom")+ # scale_fill_distiller(palette = "Spectral") #
Mapping of strong hesitancy
{r, eval=FALSE} # ggplot(my_data0_map, aes(x = long, y = lat, group = group, fill = est_strong_hesitant)) + # geom_polygon(color = "white", size = 0.05) + # theme_void() + # coord_fixed(ratio = 1.3) + # labs(fill = "Proportion of residents STRONGLY hesitant to be vaccinated") + # theme(legend.position="bottom")+ # scale_fill_distiller(palette = "Spectral") #
H3: Hesitancy Map
{r,echo= FALSE} # ggplot(my_data0_map, aes(x = long, y = lat, group = group, fill = est_hesitant)) + # geom_polygon(color = "white", size = 0.05) + # theme_void() + # coord_fixed(ratio = 1.3) + # labs(fill = "Proportion of residents hesitant to be vaccinated") + # theme(legend.position="bottom")+ # scale_fill_distiller(palette = "Spectral") #
H3: Strong Hesitancy Map
{r, echo= FALSE} # ggplot(my_data0_map, aes(x = long, y = lat, group = group, fill = est_strong_hesitant)) + # geom_polygon(color = "white", size = 0.05) + # theme_void() + # coord_fixed(ratio = 1.3) + # labs(fill = "Proportion of residents STRONGLY hesitant to be vaccinated") + # theme(legend.position="bottom")+ # scale_fill_distiller(palette = "Spectral") #
H3: zooming in on distinct areas
{r midwest} # ggplot() + # geom_polygon(data = my_data0_map, aes(x = long, y = lat, group = group, fill = est_strong_hesitant), color = "white", size = 0.05) + # geom_polygon(data = usa_states, aes(x = long, y = lat, group = group),fill="NA", colour = "black") + # theme_void() + # coord_fixed(xlim = c(-110, -90), ylim = c(42, 50), ratio = 1.3) + # labs(fill = "Proportion of residents STRONGLY hesitant to be vaccinated") + # theme(legend.position="bottom")+ # scale_fill_distiller(palette = "Spectral") # # remove legend! # guides(fill = FALSE) #
{r tenn} # ggplot() + # geom_polygon(data = my_data0_map, aes(x = long, y = lat, group = group, fill = est_hesitant), color = "white", size = 0.05) + # geom_polygon(data = usa_states, aes(x = long, y = lat, group = group),fill="NA", colour = "black") + # theme_void() + # coord_fixed(xlim = c(-95, -75), ylim = c(30, 40), ratio = 1.3) + # labs(fill = "Proportion of residents STRONGLY hesitant to be vaccinated") + # theme(legend.position="bottom")+ # scale_fill_distiller(palette = "Spectral") # # remove legend! # guides(fill = FALSE) #
H1: Analysis of Maps
I observe a striking visual pattern in the mapping of county hesitancy levels. In many places on the map, we see areas that dont
IDK yet but theres something about how state lines really impact fill. I ran a cluser analysis to see if I was making this trend up or not
Try out clustering # {r, warning=FALSE, message=FALSE} # my_data0_map_cluster <- my_data0_map %>% # select(est_hesitant, long, lat) # # # set.seed(15) # library(mclust) # county_clusts <- my_data0_map_cluster %>% # kmeans(centers = 48)%>% # fitted("classes")%>% # as.character() # # my_data0_map_cluster <- my_data0_map_cluster %>% mutate(cluster = county_clusts) # # my_data0_map_cluster %>% ggplot(aes(x = long, y = lat)) + # geom_point(aes(color = cluster), alpha = 0.5)+ # coord_fixed(ratio = 1.3) #
{r, echo=FALSE} # #usa_states <- map_data(map = "state", region = ".") # # ggplot()+ # geom_point(data = my_data0_map_cluster, aes(x = long, y = lat, color = cluster), alpha = 0.5)+ # geom_polygon(data = usa_states, aes(x = long, y = lat, group = group),fill="NA", colour = "black") + # theme_void()+ # theme(legend.position="none") #
H1: Including links and images
fauchi
How to make tabs
Bulleted list
You can make a bulleted list like this:
- item 1
- item 2
- item 3
Numbered list
You can make a numbered list like this
- First thing I want to say
- Second thing I want to say
- Third thing I want to say